package com.qf.controller;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.qf.Utils.Json;
import com.qf.contstrant.Constant;
import com.qf.service.IndexService;
import com.qf.vo.GoodsType;
import org.apache.commons.lang.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 你的名字
 * @Date: 2021/07/10/17:27
 * @Description:
 */
@Controller
public class IndexController {
    @Autowired
    private IndexService indexService;
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private StringRedisTemplate redisTemplate;

    @GetMapping({"/index.html", "/"})
    public String getGoodTypeList(ModelMap modelMap) {
        String data = redisTemplate.opsForValue().get(Constant.HOMEKEY);
        if (StringUtils.isEmpty(data)) {
             data = queryGoodsTypeList();
        }
        //从缓存中取出json数据并转为集合
     List<GoodsType>   goodTypeList= Json.fromJson(data,List.class);
        System.out.println(goodTypeList);
        modelMap.put("goodTypeList", goodTypeList);
        return "index";
    }

    /**
     * 从数据库中查询商品类型
     */
    private String queryGoodsTypeList() {
        // 1.获取锁
        RLock lock = redissonClient.getLock("home-godos-type-lock");

        // 2.加锁
        lock.lock(); // 锁的默认的超时时间
        try {

            // 3.再次查询数据
            String data = redisTemplate.opsForValue().get(Constant.HOMEKEY);
            if (StringUtils.isEmpty(data)) {
                // 2.处理义务
                // 1.查询商品的类型的数据
                List<GoodsType> goodsTypeList = indexService.getGoodTypeList();
                List<GoodsType> newGtList = new ArrayList<>();

                // 循环找到一级分类
                for (GoodsType goodsType : goodsTypeList) {
                    if (goodsType.getGoodsTypePid() == -1) {
                        newGtList.add(goodsType);
                    }
                }
                // 寻找一级分类下面的二级分类
                for (GoodsType l1 : newGtList) {
                    for (GoodsType l2 : goodsTypeList) {
                        if (l2.getGoodsTypePid() == l1.getId()) {
                            l1.getChildList().add(l2);
                        }
                    }
                }
                // 2.查询出数据后要给缓存中放一份
                // 把集合转成一个JSON字符串
                data = Json.toJSON(newGtList);
                if (!StringUtils.isEmpty(data)) {
                    redisTemplate.opsForValue().set(Constant.HOMEKEY, data, 10, TimeUnit.DAYS);
                }else{
                    // 解决缓存穿透的问题
                    redisTemplate.opsForValue().set(Constant.HOMEKEY,"null");
                }
            }
            return data;
        } finally {
            // 3.释放锁
            lock.unlock();
        }
    }
}




